package getui

type TokenRequest struct {
	Sign string `json:"sign"`

	Timestamp string `json:"timestamp"`

	AppKey string `json:"appkey"`
}

type TokenResponse struct {
	Code int `json:"code"`

	Msg string `json:"msg"`

	Data TokenData `json:"data,omitempty"`
}

// TokenData is the token payload
type TokenData struct {
	ExpireTime int64  `json:"expire_time,string"`
	Token      string `json:"token"`
}

// 绑定别名请求数据
type BindAliasData struct {
	CID string `json:"cid"`

	Alias string `json:"alias"`
}

type BindAliasResponse struct {
	Code int `json:"code"`

	Msg string `json:"msg"`
}

// TaskDetail 推送结果
// 任务编号 key: App的用户唯一标识，value: 推送结果
// 	successed_offline: 离线下发(包含厂商通道下发)，
// 	successed_online: 在线下发，
// 	successed_ignore: 最近90天内不活跃用户不下发
type TaskDetail map[string]map[string]string

// SingleRequest is the request that used to push to single user
type SingleRequest struct {
	// RequestId 必填，请求唯一标识号，10-32位之间；如果request_id重复，会导致消息丢失
	RequestId string `json:"request_id"`

	// Audience 必填，推送目标用户，CID和Alias互斥
	Audience PushAudience `json:"audience"`

	// Setting 推送条件设置
	Setting *PushSetting `json:"settings,omitempty"`

	// PushMessage 必填，个推推送消息参数
	PushMessage PushMessage `json:"push_message"`

	// PushChanel 厂商推送消息参数，包含ios消息参数，android厂商消息参数
	PushChanel *PushChannel `json:"push_channel,omitempty"`
}

// SingleResponse 执行cid单推 响应结果
type SingleResponse struct {
	Code int `json:"code"`

	Msg string `json:"msg"`

	// 任务编号 key: App的用户唯一标识，value: 推送结果
	// 	successed_offline: 离线下发(包含厂商通道下发)，
	// 	successed_online: 在线下发，
	// 	successed_ignore: 最近90天内不活跃用户不下发
	Data TaskDetail `json:"data,omitempty"`
}

// AllRequest is the request that used to push to all users
type AllRequest struct {
	// RequestId 必填，请求唯一标识号，10-32位之间；如果request_id重复，会导致消息丢失
	RequestId string `json:"request_id"`

	// GroupName 任务组名
	GroupName string `json:"group_name,omitempty"`

	// Audience 必填，固定值all
	Audience string `json:"audience"`

	// Setting 推送条件设置
	Setting *PushSetting `json:"settings,omitempty"`

	// PushMessage 必填，个推推送消息参数
	PushMessage PushMessage `json:"push_message"`

	// PushChanel 厂商推送消息参数，包含ios消息参数，android厂商消息参数
	PushChanel *PushChannel `json:"push_channel,omitempty"`
}

// AllResponse 执行pushtoAll 响应结果
type AllResponse struct {
	Code int `json:"code"`

	Msg string `json:"msg"`

	// 任务编号
	TaskId string `json:"data"`
}

// SingleBatchRequest 批量单推
type SingleBatchRequest struct {
	// IsAsync 是否异步推送，true是异步，false同步。异步推送不会返回data详情
	IsAsync bool `json:"is_async,omitempty"`

	// Data 消息内容，数组长度不大于 200
	Data []SingleRequest `json:"msg_list"`
}

// PushSetting 消息推送的setting设置数据
type PushSetting struct {
	// TTL 消息离线时间设置，单位毫秒，-1表示不设离线，-1 ～ 3 * 24 * 3600 * 1000(3天)之间
	TTL int64 `json:"ttl"`

	// Speed ,pushtoAll 用的参数，定速推送，例如100，个推控制下发速度在100条/秒左右，0表示不限速
	Speed int `json:"speed,omitempty"`

	// Strategy 厂商下发策略选择
	Strategy *SettingStrategy `json:"strategy,omitempty"`

	// ScheduleTime 定时推送时间，格式：毫秒时间戳，需联系个推开通
	ScheduleTime int64 `json:"schedule_time,omitempty"`
}

type SettingStrategy struct {
	Default int `json:"default,omitempty"`
	IOS     int `json:"ios,omitempty"`
	ST      int `json:"st,omitempty"`
}

// PushAudience 推送目标用户,CID和Alias 互斥
type PushAudience struct {
	// CID cid，the length of CID must be 1
	CID []string `json:"cid,omitempty"`

	// Alias 别名数组，只能填一个别名
	Alias []string `json:"alias,omitempty"`
}

// PushMessage 个推通道消息内容
type PushMessage struct {
	// Duration 手机端通知展示时间段，格式为毫秒时间戳段，两个时间的时间差必须大于10分钟，例如："1590547347000-1590633747000"
	Duration string `json:"duration,omitempty"`

	// Notification 通知消息内容，仅支持安卓系统，iOS系统不展示个推通知消息，与transmission、revoke三选一，都填写时报错
	Notification *PushNotification `json:"notification,omitempty"`

	// Transmission 纯透传消息内容，安卓和iOS均支持，与notification、revoke 三选一，都填写时报错，长度 ≤ 3072
	Transmission string `json:"transmission,omitempty"`

	// Revoke 撤回消息时使用(仅支持撤回个推通道消息)，与notification、transmission三选一，都填写时报错(消息撤回请勿填写策略参数)
	Revoke *PushRevoke `json:"revoke,omitempty"`
}

// PushNotification 通知消息内容，仅支持安卓系统，iOS系统不展示个推通知消息，与transmission、revoke三选一，都填写时报错
type PushNotification struct {
	// Title 必填，通知消息标题，长度 ≤ 50
	Title string `json:"title"`

	// Body 必填，通知消息内容，长度 ≤ 256
	Body string `json:"body"`

	// BigText 长文本消息内容，通知消息+长文本样式，与big_image二选一，两个都填写时报错，长度 ≤ 512
	BigText string `json:"big_text,omitempty"`

	// BigImg 大图的URL地址，通知消息+大图样式， 与big_text二选一，两个都填写时报错，长度 ≤ 1024
	BigImg string `json:"big_image,omitempty"`

	// Logo 通知的图标名称，包含后缀名（需要在客户端开发时嵌入），如“push.png”，长度 ≤ 64
	Logo string `json:"logo,omitempty"`

	// LogoUrl 通知图标URL地址，长度 ≤ 256
	LogoUrl string `json:"logo_url,omitempty"`

	// ChannelId 通知渠道id，长度 ≤ 64,默认值：Default
	ChannelId string `json:"channel_id,omitempty"`

	// ChannelName 通知渠道名称，长度 ≤ 64,默认值：Default
	ChannelName string `json:"channel_name,omitempty"`

	// ChannelLevel 设置通知渠道重要性,默认3（可以控制响铃，震动，浮动，闪灯等等）
	// 	android8.0以下
	// 	0，1，2:无声音，无振动，不浮动
	// 	3:有声音，无振动，不浮动
	// 	4:有声音，有振动，有浮动
	// 	android8.0以上
	// 	0：无声音，无振动，不显示；
	// 	1：无声音，无振动，锁屏不显示，通知栏中被折叠显示，导航栏无logo;
	// 	2：无声音，无振动，锁屏和通知栏中都显示，通知不唤醒屏幕;
	// 	3：有声音，无振动，锁屏和通知栏中都显示，通知唤醒屏幕;
	// 	4：有声音，有振动，亮屏下通知悬浮展示，锁屏通知以默认形式展示且唤醒屏幕;
	ChannelLevel int `json:"channel_level,omitempty"`

	// ClickType 必填，点击通知后续动作，目前支持以下后续动作，
	// 	intent：打开应用内特定页面，
	// 	url：打开网页地址，
	// 	payload：自定义消息内容启动应用，
	// 	payload_custom：自定义消息内容不启动应用，
	// 	startapp：打开应用首页，
	// 	none：纯通知，无后续动作
	ClickType string `json:"click_type"`

	// Intent  click_type为intent时必填
	Intent string `json:"intent,omitempty"`

	// Url click_type为url时必填
	Url string `json:"url,omitempty"`

	// Payload click_type为payload/payload_custom时必填
	Payload string `json:"payload,omitempty"`

	// NotifyId 覆盖任务时会使用到该字段，两条消息的notify_id相同，新的消息会覆盖老的消息，范围：0-2147483647
	NotifyId int32 `json:"notify_id,omitempty"`

	// RingName 自定义铃声，请填写文件名，不包含后缀名(需要在客户端开发时嵌入)，个推通道下发有效，客户端SDK最低要求 2.14.0.0
	RingName string `json:"ring_name,omitempty"`

	// BadgeAddNumber 角标, 必须大于0, 个推通道下发有效
	// 	此属性目前仅针对华为 EMUI 4.1 及以上设备有效
	// 	角标数字数据会和之前角标数字进行叠加；
	// 	举例：角标数字配置1，应用之前角标数为2，发送此角标消息后，应用角标数显示为3。
	// 	客户端SDK最低要求 2.14.0.0
	BadgeAddNumber int `json:"badge_add_num,omitempty"`
}

// PushRevoke 撤回消息时使用
type PushRevoke struct {
	// OldTaskId 需要撤回的taskId
	OldTaskId string `json:"old_task_id"`

	// Force 在没有找到对应的taskId，是否把对应appId下所有的通知都撤回
	Force bool `json:"force,omitempty"`
}

// PushChannel 厂商通道消息内容
type PushChannel struct {
	// Android 	android通道推送消息内容
	Android *PushChanelAndroid `json:"android,omitempty"`

	// IOS 	ios通道推送消息内容
	IOS *PushChanelIOS `json:"ios,omitempty"`
}

// PushChanelAndroid android通道推送消息内容
type PushChanelAndroid struct {
	Ups *AndroidUps `json:"ups,omitempty"`
}

type AndroidUps struct {
	// Notification 通知消息内容，与transmission 二选一，两个都填写时报错
	Notification *UpsNotification `json:"notification,omitempty"`

	// Transmission 透传消息内容，与notification 二选一，两个都填写时报错，长度 ≤ 3072
	Transmission string `json:"transmission,omitempty"`

	// Options 第三方厂商扩展内容
	Options map[string]map[string]interface{} `json:"options,omitempty"`
}

type UpsNotification struct {
	// Title 必填 通知栏标题（长度建议取最小集）
	// 	小米：title长度限制为50字
	// 	华为：title长度限制40字
	// 	魅族：title长度限制32字
	// 	OPPO：title长度限制32字
	// 	VIVO：title长度限制40英文字符
	Title string `json:"title"`

	// Body 必填 通知栏内容(长度建议取最小集)
	//	小米：content长度限制128字
	//	华为：content长度小于1024字
	//	魅族：content长度限制100字
	//	OPPO：content长度限制200字
	//	VIVO：content长度限制100个英文字符
	Body string `json:"body"`
	// ClickType 必填 点击通知后续动作,目前支持以下后续动作
	// 	intent：打开应用内特定页面(厂商都支持)，
	// 	url：打开网页地址(厂商都支持，华为要求https协议)，
	// 	payload：自定义消息内容启动应用(华为和oppo不支持，其他厂商支持)，
	// 	startapp：打开应用首页(厂商都支持)
	ClickType string `json:"click_type"`
	// Intent click_type为intent时必填	无	点击通知打开应用特定页面，intent格式必须正确且不能为空，长度 ≤ 2048;
	Intent string `json:"intent,omitempty"`
	// Url click_type为url时必填	无	点击通知打开链接，长度 ≤ 1024
	Url string `json:"url,omitempty"`
	// Payload click_type为payload时必填	无	点击通知加自定义消息，长度 ≤ 3072
	Payload string `json:"payload,omitempty"`
	// NotifyId 消息覆盖使用，两条消息的notify_id相同，新的消息会覆盖老的消息，范围：0-2147483647
	NotifyId int32 `json:"notify_id,omitempty"`
}

// PushChanelIOS ios通道推送消息内容
type PushChanelIOS struct {
	// Type voip：voip语音推送，notify：apns通知消息,默认为 notify默认通知消息
	Type string `json:"type,omitempty"`

	// Aps 推送通知消息内容
	Aps *IOSAps `json:"aps,omitempty"`

	// AutoBadge 用于计算icon上显示的数字，还可以实现显示数字的自动增减，如“+1”、 “-1”、 “1” 等，计算结果将覆盖badge
	AutoBadge string `json:"auto_badge,omitempty"`

	// Payload 增加自定义的数据
	Payload string `json:"payload,omitempty"`

	// MultiMedia 多媒体设置,最多3个
	MultiMedia []MultiMedia `json:"multimedia,omitempty"`

	// 使用相同的apns-collapse-id可以覆盖之前的消息
	ApnsCollapseId string `json:"apns-collapse-id,omitempty"`
}

// IOSAps 推送通知消息内容
type IOSAps struct {
	// Alert 通知消息
	Alert *IOSApsAlert `json:"alert,omitempty"`

	// Content 0表示普通通知消息(默认为0)；
	// 	1表示静默推送(无通知栏消息)，静默推送时不需要填写其他参数。
	// 	苹果建议1小时最多推送3条静默消息
	Content int `json:"content-available,omitempty"`

	// Sound 通知铃声文件名，如果铃声文件未找到，响铃为系统默认铃声。无声设置为“com.gexin.ios.silence”或不填
	Sound string `json:"sound,omitempty"`

	// Category 在客户端通知栏触发特定的action和button显示
	Category string `json:"category,omitempty"`

	// ThreadId ios的远程通知通过该属性对通知进行分组，仅支持iOS 12.0以上版本
	ThreadId string `json:"thread-id,omitempty"`
}

// IOSApsAlert 通知消息
type IOSApsAlert struct {
	// Title 通知消息标题
	Title string `json:"title,omitempty"`

	// Body 通知消息内容
	Body string `json:"body,omitempty"`

	// ActionLocKey （用于多语言支持）指定执行按钮所使用的Localizable.strings
	ActionLocKey string `json:"action-loc-key,omitempty"`

	// LockKey 用于多语言支持）指定Localizable.strings文件中相应的key
	LockKey string `json:"loc-key,omitempty"`

	// LocArgs 如果loc-key中使用了占位符，则在loc-args中指定各参数
	LocArgs []string `json:"loc-args,omitempty"`
	// LaunchImage 指定启动界面图片名
	LaunchImage string `json:"launch-image,omitempty"`
	// TitleLocKey (用于多语言支持）对于标题指定执行按钮所使用的Localizable.strings,仅支持iOS8.2以上版本
	TitleLocKey string `json:"title-loc-key,omitempty"`
	// TitleLocArgs 对于标题,如果loc-key中使用的占位符，则在loc-args中指定各参数,仅支持iOS8.2以上版本
	TitleLocArgs []string `json:"title-loc-args,omitempty"`
	// SubTitle 通知子标题,仅支持iOS8.2以上版本
	SubTitle string `json:"subtitle,omitempty"`
	// SubTitleLocKey 当前本地化文件中的子标题字符串的关键字,仅支持iOS8.2以上版本
	SubTitleLocKey string `json:"subtitle-loc-key,omitempty"`
	// SubTitleLocArgs 当前本地化子标题内容中需要置换的变量参数 ,仅支持iOS8.2以上版本
	SubTitleLocArgs []string `json:"subtitle-loc-args,omitempty"`
}

// MultiMedia 多媒体设置
type MultiMedia struct {
	// Url 多媒体资源地址
	Url string `json:"url,omitempty"`
	// Type 资源类型（1.图片，2.音频，3.视频）
	Type int `json:"type,omitempty"`
	// OnlyWifi 是否只在wifi环境下加载，如果设置成true,但未使用wifi时，会展示成普通通知
	OnlyWifi string `json:"only_wifi,omitempty"`
}
